home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / byteibm.arc / DAHMKE.ARC / MCDFIG7.ASM < prev    next >
Assembly Source File  |  1985-07-12  |  8KB  |  326 lines

  1.        PAGE 66,132
  2. ;
  3. ;       Utility subroutines for use with MS-FORTRAN
  4. ;
  5. ;    by Mark Dahmke
  6. ;    May, 1986
  7. ;
  8.         PUBLIC  SRCHF, SRCHN, CHDIR, GETDIR, GETDFS
  9. ;
  10.     SUBTTL    'MACROS'
  11.     PAGE
  12. ;
  13. ;------ MACROS ------
  14. ;
  15. DOS    MACRO    
  16.     INT      21H     ;REQUEST DOS SERVICE
  17.     ENDM
  18. ;
  19. ;---------------------------------------------------------------
  20. ;  SETFRAME:  Sets the environment upon entry to a subroutine.
  21. ;
  22. SETFRAME MACRO
  23.     PUSH    BP        ;SAVE FRAMEPOINTER ON STACK
  24.     MOV    BP,SP
  25.       ENDM
  26. ;
  27. ;  POPRET:    Restores the BP register and returns to the
  28. ;             calling FORTRAN routine after cleaning up the
  29. ;             stack.
  30. ;
  31. POPRET  MACRO   NPARMS        ;RETURN FROM SUBR.  NPARMS=NUMBER OF PARMS
  32.     POP    BP
  33.     RET    NPARMS*4
  34.     ENDM
  35. ;
  36. ; GETPARM: returns a pointer to a parameter in the call list.
  37. ;       Operands:  X = the number of the desired parameter
  38. ;                MAX = the maximum number of parameters in
  39. ;                      the call list.
  40. ;
  41. ;       Result: The ES:BX register pair points to the parameter.
  42. ;
  43. GETPARM    MACRO     X,MAX         ;PARAMETER NUMBER (IE, 1,2,3)
  44.     LES    BX,DWORD PTR SS:[BP+(MAX-X)*4+6] 
  45.     ENDM
  46. ;
  47. ;
  48. ;--------------------------------------------------------------
  49. ;
  50.     SUBTTL    'DATA SEGMENT'
  51.     PAGE
  52. ;-------------------------------
  53. DATA    SEGMENT PUBLIC 'DATA'
  54. ;
  55. SDMA    DB      128 DUP(0)         ;DMA BUFFER FOR SRCHF AND SRCHN ROUTINES
  56. ;
  57. FCB     DB      0
  58.         DB      8 DUP(0)        ;FILE NAME (1-8)
  59.         DB      0,0,0           ;FILE TYPE (9-11)
  60.     DW    0        ;CURRENT BLOCK (12-13)
  61.     DW    0        ;LOGICAL RECORD SIZE (14-15)
  62.     DW    0,0        ;FILE SIZE (16-19)
  63.     DW    0        ;DATE (20-21)
  64.     DW    0,0,0,0,0     ;RESERVED (22-31)
  65.     DB    0        ;CURRENT RELATIVE RECORD
  66.     DW    0,0        ;RELATIVE RECORD NUMBER
  67.         DB      0
  68.     DB    0
  69. ;
  70. IDRIVE    DW    0
  71. STRING    DW    0
  72. STRING_SEG DW    0
  73. ;
  74. DATA    ENDS
  75. DGROUP    GROUP    DATA 
  76. ;
  77.     SUBTTL    'CODE SEGMENT'    
  78.     PAGE
  79. ;
  80. CODE    SEGMENT    'CODE'
  81.     ASSUME    CS:CODE, DS:DGROUP, SS:DGROUP
  82. ;
  83. ;-------------------------------
  84. ;SEARCH FOR FIRST DIRECTORY ENTRY
  85. ;
  86. ; PARM LIST:    CALL SRCHF(IDRV,FSPEC,RFNAME)
  87. ;
  88. ; INPUT: IDRV, FSPEC -- 0=CURRENT, 1=A, 2=B,   FSPEC= ????????.???
  89. ; OUTPUT: RFNAME -- FILENAME.TYP
  90. ;
  91. SRCHF   PROC    FAR             ;SEARCH FOR FIRST DIR ENTRY
  92.     SETFRAME
  93. ;
  94.     GETPARM    1,3        ;GET DRIVE CODE    ADDR
  95.     MOV    AX,ES:[BX]    ;GET VALUE
  96.     MOV    IDRIVE,AX
  97.     MOV    FCB,AL        ;SET UP FCB
  98. ;
  99.     GETPARM 2,3        ;GET FILESPEC
  100. ;
  101.     MOV    STRING,BX
  102.     MOV    STRING_SEG,ES    ;SAVE PTR AND SEG
  103. ;
  104.     MOV    DI,OFFSET DGROUP:FCB+1
  105.     PUSH    DS        ;SAVE DS
  106.     PUSH    DS
  107.         POP      ES        ;SET UP DEST  
  108.     MOV     SI,STRING
  109.     MOV    DS,STRING_SEG
  110.     MOV    CX,11
  111.     REP    MOVSB        ;COPY FILESPEC 11 CHARS
  112. ;
  113.     POP    DS        ;RESTORE DS
  114.     MOV    DX,OFFSET DGROUP:SDMA
  115.         MOV     AH,1AH
  116.         DOS            ;SET DMA ADDRESS
  117. ;
  118.         MOV     DX,OFFSET DGROUP:FCB    
  119.         MOV     AH,11H          ;SEARCH-FIRST BDOS COMMAND
  120.         DOS
  121. ;
  122.         CMP     AL,0FFH    
  123.         JZ      NO_FILES        ;IF NO FILES, SKIP OUT.
  124. ;
  125.     GETPARM    3,3        ;GET RETURN FILENAME ADDR IN ES:BX
  126.     MOV    DI,BX        ;SET UP ES:DI POINTER FOR MOVE
  127.     MOV    SI,OFFSET DGROUP:SDMA+1    ;POINT TO FILE NAME
  128.     PUSH    DS
  129.     POP    ES        ;SET UP DEST SEG
  130.     MOV    CX,11        ;MOVE 11 BYTES
  131.     REP    MOVSB
  132. ;
  133.         JMP    S_DONE
  134. ;
  135. ;
  136. NO_FILES:                       ;IF NO FILES ARE PRESENT, 
  137.     GETPARM    3,3
  138.     MOV    BYTE PTR ES:[BX],'?'    ;PUT A ? IN FIRST CHAR 
  139.                     ;OF OUTPUT FILE NAME
  140. S_DONE: POPRET    3
  141. SRCHF     ENDP
  142. ;    
  143. ;-------------------------------
  144. ;SEARCH FOR NEXT DIRECTORY ENTRY
  145. ;
  146. ; PARM LIST:    CALL SRCHN(IDRV,FSPEC,RFNAME)
  147. ;
  148. ; INPUT: IDRV, FSPEC -- 0=CURRENT, 1=A, 2=B,   FSPEC= ????????.???
  149. ; OUTPUT: RFNAME -- FILENAME.TYP
  150. ;
  151. SRCHN   PROC    FAR             ;SEARCH FOR NEXT  DIR ENTRY
  152.     SETFRAME
  153. ;
  154.     GETPARM    1,3        ;GET DRIVE CODE    ADDR
  155.     MOV    AX,ES:[BX]    ;GET VALUE
  156.     MOV    IDRIVE,AX
  157.     MOV    FCB,AL        ;SET UP FCB
  158. ;
  159.     GETPARM 2,3        ;GET FILESPEC
  160. ;
  161.     MOV    STRING,BX
  162.     MOV    STRING_SEG,ES    ;SAVE PTR AND SEG
  163. ;
  164.     PUSH    DS        ;SAVE SEG
  165.     PUSH    DS
  166.     POP    ES
  167.     MOV    DI,OFFSET DGROUP:FCB+1
  168.     MOV    SI,STRING
  169.     MOV    DS,STRING_SEG
  170.     MOV    CX,11
  171.     REP    MOVSB        ;COPY FILESPEC 11 CHARS
  172. ;
  173.     POP    DS
  174.     MOV    DX,OFFSET DGROUP:SDMA
  175.         MOV     AH,1AH
  176.         DOS            ;SET DMA ADDRESS
  177. ;
  178.         MOV     DX,OFFSET DGROUP:FCB
  179.         MOV     AH,12H          ;SEARCH-NEXT  BDOS COMMAND
  180.         DOS
  181. ;
  182.         CMP     AL,0FFH    
  183.         JZ      NNO_FILES        ;IF NO FILES, SKIP OUT.
  184. ;
  185.     GETPARM    3,3            ;GET RETURN FILENAME ADDR IN ES:BX
  186.     MOV    DI,BX            ;SET UP ES:DI POINTER FOR MOVE
  187.     MOV    SI,OFFSET DGROUP:SDMA+1    ;POINT TO FILE NAME
  188.     MOV    CX,11            ;MOVE 11 BYTES
  189.     REP    MOVSB
  190. ;
  191.      JMP    N_DONE
  192. ;
  193. NNO_FILES:                       ;IF NO FILES ARE PRESENT, 
  194.     GETPARM    3,3
  195.     MOV    BYTE PTR ES:[BX],'?'    ;PUT A ? IN FIRST CHAR OF OUTPUT FILE NAME
  196.                                 ;OUTPUT FILE NAME
  197. N_DONE: POPRET    3
  198. SRCHN    ENDP
  199. ;----------------------------------
  200. ;  GETDIR:  RETURN ASCII STRING CONTAINING CURRENT DIRECTORY PATH
  201. ;
  202. ;            
  203. ;  CALL GETDIR(PATH,IDRIVE,ICODE)    
  204. ;
  205. ;       PATH  = CHARACTER*64          (RETURNED PATH NAME)
  206. ;       ICODE = INTEGER               (RETURN CODE)
  207. ;       IDRIVE= INTEGER               (DRIVE, 0=DEFAULT, 1=A, 2=B)
  208. ;
  209. ;    NOTE: PATH IS RETURNED WITH NO STARTING BACKSLASH
  210. ;          AND WITHOUT THE DRIVE LETTER AND COLON.
  211. ;          THE PATH STRING IS TERMINATED WITH A ZERO BYTE.
  212. ;
  213. GETDIR  PROC    FAR             ;GET PATH NAME ON IDRIVE
  214. ;
  215.     SETFRAME
  216. ;
  217.     GETPARM    1,3
  218.     MOV    STRING,BX    ;SAVE PTR TO OUTPUT STRING AREA
  219.     MOV    STRING_SEG,ES    ;AND SEG
  220. ;
  221.     GETPARM    2,3        ;GET DRIVE CODE    ADDR
  222.     MOV    AX,ES:[BX]    ;GET VALUE
  223.     MOV    IDRIVE,AX    ;AND SAVE IT
  224. ;        
  225.     PUSH    DS
  226.     MOV    SI,STRING    ;SET UP PATH STRING POINTER
  227. ;
  228.     MOV    DX,IDRIVE    ;GET DRIVE NUMBER
  229.     MOV     AX,STRING_SEG
  230.     MOV    DS,AX
  231. ;
  232.     MOV    AH,47H        ;GET DIRECTORY NAME
  233.         DOS
  234. ;
  235.     GETPARM    3,3
  236.     MOV    AH,0        ;CLEAR OUT AH
  237.     MOV    ES:[BX],AX    ;STORE IT
  238. ;    
  239.     POP    DS
  240.         POPRET    3
  241. GETDIR    ENDP
  242. ;----------------------------------
  243. ;  CHDIR:  SET DIRECTORY PATH TO STRING FOUND IN PATH.
  244. ;
  245. ;            
  246. ;  CALL CHDIR(PATH,ICODE)    
  247. ;
  248. ;       PATH  = CHARACTER*64          (INPUT PATH NAME)
  249. ;       ICODE = INTEGER               (RETURN CODE)
  250. ;
  251. ;    NOTE: PATH MUST CONTAIN THE PATH NAME, TERMINATED BY
  252. ;          A ZERO BYTE.  THE DRIVE LETTER AND COLON AND
  253. ;          BACKSLASH MAY BE AT THE START OF THE STRING.   
  254. ;
  255. CHDIR   PROC    FAR             ;SET PATH NAME
  256. ;
  257.     SETFRAME
  258. ;
  259.     GETPARM    1,2    
  260.     MOV    STRING,BX    ;SAVE PTR TO INPUT STRING AREA
  261.     MOV    STRING_SEG,ES    ;AND SEG
  262. ;
  263.     PUSH    DS        ;SAVE DS
  264.     PUSH    ES
  265.     POP    DS
  266.     MOV    DX,BX        ;SET UP PATH STRING POINTER
  267. ;
  268.     MOV    AH,3BH        ;SET DIRECTORY PATH
  269.         DOS
  270. ;
  271.     GETPARM    2,2        ;POINT TO ICODE
  272.     MOV    AH,0        ;CLEAR OUT AH
  273.     MOV    ES:[BX],AX    ;STORE IT
  274. ;    
  275.     POP    DS        ;RESTORE DS
  276.         POPRET    2
  277. CHDIR    ENDP
  278.  
  279. ;----------------------------------
  280. ;  GETDFS: GET DISK FREE SPACE IN BYTES.
  281. ;
  282. ;            
  283. ;  CALL GETDFS(IDRIVE,IBYTES,ISECT,ICLUST)
  284. ;    
  285. ;    IDRIVE= INTEGER*2          (DRIVE NUMBER)
  286. ;       IBYTES= INTEGER*2             (NUMBER OF BYTES /SECTOR)
  287. ;    ISECT = INTEGER*2          (NUMBER OF SECTORS / CLUSTER)
  288. ;    ICLUST= INTEGER*2          (NUMBER OF CLUSTERS REMAINING)
  289. ;       
  290. ;    IF ISECT = FFFFh THEN ERROR: INVALID DRIVE CODE
  291. ;
  292. GETDFS  PROC    FAR             ;GET SPACE REMAINING
  293. ;
  294.     SETFRAME
  295. ;    
  296.     GETPARM    1,4    
  297.     MOV    DX,ES:[BX]      ;GET DRIVE NUMBER
  298. ;
  299.     MOV    AH,36H        ;SET DIRECTORY PATH
  300.         DOS
  301. ;
  302. ; THIS FUNCTION RETURNS:  AX=FFFF IF ERROR,
  303. ;    BX = NUMBER OF CLUSTERS    AVAILABLE
  304. ;    CX = NUMBER OF BYTES PER SECTOR
  305. ;    AX = NUMBER OF SECTORS PER CLUSTER
  306. ;
  307. ;  THEREFORE, IBYTES = AX * BX * CX
  308. ;
  309.     PUSH    BX        ;PUSH ICLUST
  310.     GETPARM 2,4
  311.     MOV    ES:[BX],CX    ;SAVE IBYTES
  312. ;
  313.     GETPARM 3,4        ;SAVE ISECT
  314.     MOV    ES:[BX],AX
  315. ;
  316.     GETPARM    4,4
  317.     POP    AX
  318.     MOV    ES:[BX],AX    ;SAVE ICLUST
  319. ;    
  320.         POPRET    4
  321. GETDFS    ENDP
  322. ;
  323. CODE    ENDS
  324.     END 
  325.